package com.shen.jcbf.strbf;

import org.junit.Test;

/**
 * 说明：String 和 final 测试
 * 
 * @author shenhx
 * @date 2017年6月20日
 */
public class StringFinal {

	/**
	 * 说明：final 相当于c++的"宏"，
	 * 
	 * 第一个输出：true，第二个输出：false 因为java使用常量池来管理曾经使用过的字符串直接量，例如执行string
	 * a="java"；语句后，系统的字符串池中就会缓存一个字符串"java"；如果程序再次执行string
	 * b="java";后系统将会让b直接指向字符串池中的"java"字符串，因此a==b将会返回true；这就是为什么上面代码中第一个输出true。
	 * 对于s3，其值由运算得到，str1和str2只是两个普通的变量，编译器不会执行宏替换，因此编译器无法在编译时确定s3的值，也无法将s3
	 * 指向字符串池中的缓存，所以第二个输出语句输出false。
	 * 要让第二个也输出true，只需让str1和str2变量被final修饰就行了，这样程序中所有str1和str2变量都会被其值替换，
	 * 在编译前就可以确定s3的值。
	 * 
	 * @author shenhx
	 * @date 2017年6月20日
	 */
	/*public void test001() {
		String s1 = "我爱dota";
		String s2 = "我爱" + "dota";
		System.out.println(s1 == s2);
		String str1 = "我爱";
		String str2 = "dota";
		String s3 = str1 + str2;
		System.out.println(s1 == s3);
		final String str11 = "我爱";
		final String str22 = "dota";
		final String s33 = str11 + str22;
		System.out.println(s1 == s33);

		String str001 = new String("abc").intern();
	}

	*//**
	 * 说明：Sting 的 intern() 方法实例。
	 * 
	 * @author shenhx
	 * @date 2017年6月23日
	 *//*
	@Test
	public void test002() {
		// 这个例子是说，调用 intern() 方法，查看常量池中是否已经有了这个对象，有，就返回常量池中的
		String a = "b";
		String b = "b";
		System.out.println(a == b);
		String c = "d";
		String d = new String("d").intern();
		System.out.println(c == d);

		System.out.println("-------分隔符--------");

		// 这个例子说明 s3 得到的的常量池中的对象，且，new 关键字用了之后，是创建新对象
		String s1 = "ab123";
		String s2 = new String("ab123");
		System.out.println(s1 == s2);
		String s3 = s2.intern();
		System.out.println(s1 == s3);
	}

	
	*//**
	 * 说明：创建了几个对象
	 * @author shenhx
	 * @date 2017年6月23日
	 *//*
	@Test
	public void test003() {
		String a = "ab"; // 创建了一个对象，并加入字符串池中
		System.out.println("String a = \"ab\";");
		String b = "cd";// 创建了一个对象，并加入字符串池中
		System.out.println("String b = \"cd\";");
		String c = "abcd";// 创建了一个对象，并加入字符串池中
		String d = "ab" + "cd";

		if (d == c) {
			// 如果d和c指向了同一个对象，则说明d也被加入了字符串池
			System.out.println("\"ab\"+\"cd\" 创建的对象 \"加入了\" 字符串池中");
		}else {
			// 如果d和c没有指向了同一个对象，则说明d没有被加入字符串池
			System.out.println("\"ab\"+\"cd\" 创建的对象 \"没加入\" 字符串池中");
		}
		String e = a + "cd";
		if (e == c) {
			// 如果e和c指向了同一个对象，则说明e也被加入了字符串池
			System.out.println(" a +\"cd\" 创建的对象 \"加入了\" 字符串池中");
		}else {
			// 如果e和c没有指向了同一个对象，则说明e没有被加入字符串池
			System.out.println(" a +\"cd\" 创建的对象 \"没加入\" 字符串池中");
		}
		String f = "ab" + b;
		// 如果f和c指向了同一个对象，则说明f也被加入了字符串池
		if (f == c) {
			System.out.println("\"ab\"+ b 创建的对象 \"加入了\" 字符串池中");
		}else {
			// 如果f和c没有指向了同一个对象，则说明f没有被加入字符串池
			System.out.println("\"ab\"+ b 创建的对象 \"没加入\" 字符串池中");
		}
		String g = a + b;
		// 如果g和c指向了同一个对象，则说明g也被加入了字符串池
		if (g == c) {
			System.out.println(" a + b 创建的对象 \"加入了\" 字符串池中");
		}else {
			// 如果g和c没有指向了同一个对象，则说明g没有被加入字符串池c
			System.out.println(" a + b 创建的对象 \"没加入\" 字符串池中");
		}
	}
	
	@Test
	public void test004(){
		String str1 = "abc";
		String str2 = new String("abc");
		String str3 = "abc";
		System.out.println(str1 == str2);
		System.out.println(str1 == str3);
		str3 += "d";
		System.out.println(str3);
		System.out.println(str1);
		
		
	}*/
	
}
